package domein;

import java.util.ArrayList;
import java.util.List;

import persistentie.PersistentieController;

import domein.exceptie.InvalidMovementException;

/**
 * @author Bart Beyers
 * @since 14/03/2011
 */
public class SpelBord {
	
	private Vak[][] deVakken;
	private int[] startPositie, eindPositie;
	
	private String naam;
	
	public SpelBord(String naam, int breedte, int hoogte){		
		this.setNaam(naam);
		
		deVakken = new Vak[hoogte][breedte];
		
		for(int i=0; i<hoogte; i++) {
			for(int j=0; j<breedte; j++) {
				deVakken[i][j] = new Vak(j, i);
			}
		}
		
		PersistentieController.getInstance().plaatsObstakels(this);
		PersistentieController.getInstance().plaatsPersonages(this);
	}

	/**
	 * @author Bart Beyers
	 * @return De x- en y-coordinaat van de startpositie
	 */
	public int[] getStartPositie() {
		return startPositie;
	}

	/**
	 * @author Bart Beyers
	 * @param startPositie De x- en y-coordinaat van de startpositie
	 */
	public void setStartPositie(int[] startPositie) {
		this.startPositie = startPositie;
	}

	/**
	 * @author Bart Beyers
	 * @return De x- en y-coordinaat van de eindpositie
	 */
	public int[] getEindPositie() {
		return eindPositie;
	}

	/**
	 * @author Bart Beyers
	 * @param eindPositie De x- en y-coordinaat van de eindpositie
	 */
	public void setEindPositie(int[] eindPositie) {
		this.eindPositie = eindPositie;
	}
	
	/**
	 * @author Bart Beyers
	 * @param naam De naam van het spelbord
	 */
	public void setNaam(String naam) {
		this.naam = naam;
	}

	/**
	 * @author Bart Beyers
	 * @return De naam van het spelbord
	 */
	public String getNaam() {
		return naam;
	}
	
	/**
	 * @author Bart Beyers
	 * @return De vakken van het spelbord
	 */
	public Vak[][] geefSpelBord() {
		return deVakken;
	}
	
	/**
	 * @author Stefan De Coen
	 * @param posX
	 * @param posY
	 * @return vak
	 */
	public Vak geefVak(int posX, int posY) {
		return this.deVakken[posY][posX];
	}

	public Vak geefAangrenzendVak(Vak hetVak, char richting) throws InvalidMovementException, ArrayIndexOutOfBoundsException {
		if (richting == 'q') {
			if (geefVak(hetVak.getX() - 1, hetVak.getY()).isVrij())
				return geefVak(hetVak.getX() - 1, hetVak.getY());
			else
				return null;
		} else if (richting == 's') {
			if (geefVak(hetVak.getX(), hetVak.getY() + 1).isVrij())
				return geefVak(hetVak.getX(), hetVak.getY() + 1);
			else
				return null;
		} else if (richting == 'd') {
			if (geefVak(hetVak.getX() + 1, hetVak.getY()).isVrij())
				return geefVak(hetVak.getX() + 1, hetVak.getY());
			else
				return null;
		} else if (richting == 'z') {
			if (geefVak(hetVak.getX(), hetVak.getY() - 1).isVrij())
				return geefVak(hetVak.getX(), hetVak.getY() - 1);
			else
				return null;
		} else {
			throw new InvalidMovementException();
		}
	}

	/**
	 * @author Stefan De Coen
	 * @param personage
	 * @param hetVak
	 */
	public void setPersonage(SpelersPersonage personage, Vak hetVak) {
		hetVak.setPersonage(personage);
		personage.setVak(hetVak);
	}

	/**
	 * @author Stefan Decoen
	 * @param spelersVak
	 * @return Een lijst van personages
	 */
	public List<Personage> geefTegenstandersRond(Vak spelersVak) {
		int[] dx = { -1, 0, 0, 1 };
		int[] dy = { 0, 1, -1, 0 };
		
		int spelerX = spelersVak.getX();
		int spelerY = spelersVak.getY();
		
		List<Personage> dePersonages = new ArrayList<Personage>();
		for (int i = 0; i < dx.length; i++) {
			try {
				Vak hetVak = geefVak(spelerX + dx[i], spelerY + dy[i]);

				if (hetVak !=null && hetVak.getPersonage() != null) {
					dePersonages.add(hetVak.getPersonage());
				}
			} catch (ArrayIndexOutOfBoundsException e) {
				// JOptionPane.showMessageDialog(null,e.getMessage());
			}
		}

		return dePersonages;
	}
}
